package jdx_07_DCL;

public class Mgr05 {
    private static Mgr05 INSTANCE;

    private Mgr05(){}

    public static Mgr05 getInstance(){
        if(INSTANCE==null){
            synchronized (Mgr05.class){ //【实验5】这次只在这里加锁
                INSTANCE = new Mgr05();
            }
        }
        return INSTANCE;
    }
}

/*
不过这种写法是错误的，当有多条线程同时访问的时候，都有可能判断实例为空：

【实验5】
1)当线程1来访问if的时候，发现是空对象，立马拿到锁，开始执行锁块中的代码，当实例还没有初始化的时候
2)线程2这时候也来访问if了，发现也是空的，于是就直接等待拿锁，因为这时候锁被线程1征用了
3)当线程1执行完锁块中的代码，此时对象才被实例化，线程1释放锁后
4)线程2拿到锁，进入锁块，又把对象初始化了一遍

 */

